CloudShell上で一発でAssumeRoleできるワンライナーを作ってみた
はじめに
検証時に IAM ロールの作成→AssumeRole を CloudShell 上でサクッと行いたい時があったので、ワンライナーを作ってみました。
厳密にはAssumeRoleして取得した一時的な認証情報を環境変数に設定します。
CloudShell を開いている IAM プリンシパルが AssumeRole する権限を持っている前提です。
ローカルで実行する場合は以下のブログの方が適しているのでご参照ください。 AssumeRole(スイッチロール)で一時クレデンシャルを取得して環境変数にセットするワンライナー | DevelopersIO
作成したワンライナー
コマンドは以下です。{AccountId}
、{RoleName}
は適宜置き換えてください。{SessionName}
は任意のもので OK です。
eval $(aws sts assume-role \ --role-arn "arn:aws:iam::{AccountId}:role/{RoleName}" \ --role-session-name "{SessionName}" \ --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \ --output text | \ awk '{print "export AWS_ACCESS_KEY_ID="$1"\n" \ "export AWS_SECRET_ACCESS_KEY="$2"\n" \ "export AWS_SESSION_TOKEN="$3}')
試してみる
事前に AssumeRole したい IAM ロールを作成しておきます。今回はAssumeRoleOneLiner
という IAM ロールを作成しました。
それでは作成したワンライナーを実行してみます。
$ eval $(aws sts assume-role \ > --role-arn "arn:aws:iam::111111111111:role/AssumeRoleOneLiner" \ > --role-session-name "AssumeRoleOneLinerTest" \ > --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \ > --output text | \ > awk '{print "export AWS_ACCESS_KEY_ID="$1"\n" \ > "export AWS_SECRET_ACCESS_KEY="$2"\n" \ > "export AWS_SESSION_TOKEN="$3}')
戻り値はないので、エラーが出なければ成功しています。
ちゃんと AssumeRole できたか確認してみましょう。
確認にはaws sts get-caller-identity
を実行します。
$ aws sts get-caller-identity { "UserId": "AROA5J5QSVFRVTXCIMD5K:AssumeRoleOneLinerTest", "Account": "111111111111", "Arn": "arn:aws:sts::111111111111:assumed-role/AssumeRoleOneLiner/AssumeRoleOneLinerTest" }
Arn に AssumeRole したロール名とセッション名が記載されていますね。
コマンドの解説
もう少しコマンドの解説を知りたい方だけどうぞ。
まずaws sts assume-role
の結果を query と output text を使って必要な認証情報だけを取得しています。
aws sts assume-role \ > --role-arn "arn:aws:iam::111111111111:role/AssumeRoleOneLiner" \ > --role-session-name "AssumeRoleOneLinerTest" \ > --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \ > --output text |
この結果、AccessKeyId
とSecretAccessKey
、SessionToken
の値がスペース区切りで取得できます。
これを|
を使って次の ark コマンドに渡しています。
awk '{print "export AWS_ACCESS_KEY_ID="$1"\n" \ "export AWS_SECRET_ACCESS_KEY="$2"\n" \ "export AWS_SESSION_TOKEN="$3}')
ark
コマンドでは、print コマンドを使って環境変数に設定する export 分を出力します。この時$1
,$2
,$3
にはそれぞれAccessKeyId
、SecretAccessKey
、SessionToken
を参照しています。
なので、ここだけを見ると以下の出力が行われます。
export AWS_ACCESS_KEY_ID=取得したAccessKeyId export AWS_SECRET_ACCESS_KEY=取得したSecretAccessKey export AWS_SESSION_TOKEN=取得したSessionToken
最後にこの作成された export コマンドをeval
によって実行しています。
まとめ
CloudShell 上で使える AssumeRole できるワンライナーを作ってみました。もし CloudShell でサクッと使いたい時にご利用ください。
参考
AssumeRole(スイッチロール)で一時クレデンシャルを取得して環境変数にセットするワンライナー | DevelopersIO [初心者向け]Awkの使い方 #Linux - Qiita